package string

import (
	"gofly/utils/array"
	"strconv"
)

//反转字符串
//双指针法 例如:ReverseString("hello") 返回olleh ;ReverseString("helo") 返回oleh
func ReverseString(str string) string {
	strByte := []rune(str)
	num := len(strByte)
	if num == 0 {
		return ""
	}
	//双指针
	//找到中间位置
	mid := num / 2
	//最后一个元素
	j := num - 1
	//循环到中间位置
	for i := 0; i < mid; i++ {
		//多重赋值,左右两边元素交换
		strByte[i], strByte[j] = strByte[j], strByte[i]
		//右边指针往左移动
		j--
	}
	return string(strByte)
}

//反转字符串中的元音字符
//双指针法 例如:ReverseString("hello") 返回holle ;ReverseString("helo") 返回hole
func ReverseVomelsString(str string) string {
	strByte := []rune(str)
	//所有的元音字符
	vomels := []string{"a", "e", "i", "o", "u", "A", "E", "I", "O", "U"}
	left := 0
	right := len(strByte) - 1
	//左右双指针,左小于右
	for left < right {
		//左指针没在元音,往右移动
		for left < right && !array.InArray(vomels, string(strByte[left])) {
			left++
		}
		//右指针没在元音,往左移动
		for left < right && !array.InArray(vomels, string(strByte[right])) {
			right--
		}
		//交换左右指针
		strByte[left], strByte[right] = strByte[right], strByte[left]
		//左指针往右移动一位
		left += 1
		//右指针往左移动
		right -= 1
	}
	return string(strByte)
}

//反转整数
func ReverseInt(x int) int {
	//int转成string
	newstr := strconv.Itoa(x)
	str := []rune(newstr)
	right := len(str) - 1
	left := 0
	//利用左右指针法，反转
	for left < right {
		if string(str[left]) == "-" {
			left++
		}
		str[left], str[right] = str[right], str[left]
		left++
		right--
	}
	//string转成int
	x, _ = strconv.Atoi(string(str))
	//超出int范围的返回0
	if 2147483647 < x || x < (-2147483648) {
		return 0
	}
	return x
}
